home *** CD-ROM | disk | FTP | other *** search
/ ftp.whtech.com / ftp.whtech.com.7z / ftp.whtech.com / datasheets and manuals / Hardware / WHT / scsi / dsr_sources_2_2001 / mkdir < prev    next >
Encoding:
Text File  |  2006-10-19  |  7.8 KB  |  402 lines

  1. ************************************************************
  2. *                                                          *
  3. *  MKDIR - Create Subdirectory                             *
  4. *                                                          *
  5. *  This subprogram will make a subdirectory.               *
  6. *                                                          *
  7. ************************************************************
  8.  
  9. MKDIR0
  10.        ANDI R12,>FF00
  11.        AI   R12,24
  12.  
  13.        MOVB @>834C,R6
  14.        ANDI R6,>0F00
  15.        JEQ  MKDER7
  16.        AI   R6,->0100
  17.  
  18.        BL   @MAKEFN
  19.        BL   @GETDDR          Get directory info
  20.        CI   R5,0
  21.        JEQ  MKDER7
  22.  
  23. * We know the parent directory exists.
  24.  
  25. MKD1
  26.        LDCR @B03,4           Select BANK with DDR in it.
  27.        MOVB @23(R5),R1       See if there is room for one
  28.        SRL  R1,8             more subdirectory.
  29.        CI   R1,114
  30.        JEQ  MKDER4           See if there are too many subdirectories
  31.        CLR  R0
  32.  
  33. * OK.  We know there's room for it.  If it doesn't exist,
  34. * create it.
  35.  
  36. * Copy the name to the FNCB in Bank 0
  37.  
  38.        LI   R2,NCB+39
  39.        LDCR @B02,4
  40. MKD3   CB   *R2,@PERIOD
  41.        JEQ  MKD4
  42.        DEC  R2
  43.        CI   R2,NCB-1
  44.        JNE  MKD3
  45.  
  46. MKD4   LI   R3,FNCB
  47.        INC  R2
  48. MKD5   LDCR @B02,4
  49.        CB   *R2,@SPACE
  50.        JEQ  MKD6
  51.        CI   R2,NCB+40
  52.        JEQ  MKD6
  53.        MOVB *R2+,R10
  54.        LDCR @ZERO,4
  55.        MOVB R10,*R3+
  56.        JMP  MKD5
  57.  
  58. MKD6   LDCR @ZERO,4
  59. MKD7   CI   R3,FNCB+10
  60.        JEQ  MKD8
  61.        MOVB @SPACE,*R3+
  62.        JMP  MKD7
  63.  
  64. MKDER7 MOVB @B07,@>8350
  65.        LDCR @ZERO,4
  66.        B    @DSRRT
  67.  
  68. MKD8
  69.        CI   R1,0
  70.        JEQ  MKD16
  71.  
  72.        CLR  R0
  73.        DEC  R1
  74. MKD9   MOV  R0,R10
  75.        A    R1,R10
  76.        ANDI R10,>FFFE
  77.        A    R5,R10
  78.        LDCR @B03,4
  79.        MOV  @28(R10),R7
  80.        MOV  R6,R3
  81.        SRL  R3,8
  82.        SLA  R3,1
  83.        LDCR @B04,4
  84.        MPY  @SAUTBL(R3),R7
  85.        LI   R2,SECBUF
  86.        SRL  R8,1
  87.        JNC  MKD10
  88.        AI   R2,>100
  89. MKD10  SRL  R7,1
  90.        JNC  MKD11
  91.        AI   R8,>8000
  92. MKD11  LDCR @ZERO,4
  93.        BLWP @BANKIT
  94.        DATA SCSIRD
  95.        JNE  MKDERR
  96.  
  97.        LI   R7,FNCB
  98.        LI   R8,10
  99. MKD12  C    *R2+,*R7+
  100.        JL   MKD13
  101.        JH   MKD14
  102.        DECT R8
  103.        JNE  MKD12
  104.        JMP  MKDER7           Directory already exists!
  105.  
  106. MKDERR MOVB @B06,@>8350      Set error code
  107.        LDCR @ZERO,4
  108.        B    @DSRRT
  109.  
  110. MKDER4 MOVB @B04,@>8350      Out of space - directory full
  111.        LDCR @ZERO,4
  112.        B    @DSRRT
  113.  
  114. MKD13  C    R0,R1
  115.        JEQ  MKD15
  116.        MOV  R0,R10
  117.        A    R1,R10
  118.        SRL  R10,1
  119.        INC  R10
  120.        MOV  R10,R0
  121.        JMP  MKD9
  122.  
  123. MKD14  C    R0,R1
  124.        JEQ  MKD16
  125.        MOV  R0,R10
  126.        A    R1,R10
  127.        SRL  R10,1
  128.        C    R10,R0
  129.        JEQ  MKD16
  130.        MOV  R10,R1
  131.        DEC  R1
  132.        JMP  MKD9
  133.  
  134. MKD15  INC  R0
  135. MKD16
  136.        LDCR @B02,4
  137.        MOV  R0,@MKDIDX
  138.  
  139. * Now set up the new subdirectory
  140. * Let's allocate an AUs for the DDR and its FDIR
  141. *
  142.        CLR  R3               Start at beginning
  143.        CLR  R7               No preferred AU
  144.        LI   R8,2
  145.        LDCR @ZERO,4
  146.        BLWP @ALLOC
  147.        JNE  MKDERR
  148.  
  149.        CI   R4,0             See if disk is full
  150.        JEQ  MKDER4
  151.  
  152.        LDCR @B02,4           Save the AU
  153.        MOV  R5,@MKDAU1
  154.  
  155.        INC  R5
  156.        CI   R4,1
  157.        JNE  MKD17
  158.  
  159. * We only got 1 AU, allocate another for the FDIR
  160. *
  161.        LI   R8,1
  162.        LDCR @ZERO,4
  163.        BLWP @ALLOC
  164.        JNE  MKDERR
  165.        CI   R4,0
  166.        JEQ  MKDERR
  167.        LDCR @B02,4
  168. MKD17  MOV  R5,@MKDAU2
  169.  
  170. * Now build the new DDR in the DFDR buffer
  171. *
  172.  
  173. * Start by filling in the new directory name
  174. *
  175.        LI   R0,10
  176.        LI   R1,DFDR
  177.        LI   R2,FNCB
  178. MKD18
  179.        LDCR @ZERO,4
  180.        MOV  *R2+,R3
  181.        LDCR @B02,2
  182.        MOV  R3,*R1+
  183.        DECT R0
  184.        JNE  MKD18
  185.  
  186.        LI   R2,MKDRST
  187. MKD19  MOV  *R2+,*R1+
  188.        CI   R2,MKDRND
  189.        JNE  MKD19
  190.  
  191. * Now put in the AU of the FDIR.  If we only got 1 AU on the
  192. * call to ALLOC, we have to allocate another one.
  193. *
  194.        MOV  @MKDAU2,*R1+
  195.  
  196.        LDCR @B04,4           Get AU of parent DDR
  197.        MOV  @SAVEAU,R0
  198.        LDCR @B02,4
  199.        MOV  R0,*R1+
  200.  
  201. * Now blank out all subdirectory pointers
  202.  
  203. MKD20  CLR  *R1+
  204.        CI   R1,DFDR+256
  205.        JNE  MKD20
  206.  
  207. * We got the DDR set up, now write it out to disk.
  208. *
  209.  
  210.        MOV  @MKDAU1,R7
  211.        MOV  R6,R3
  212.        SRL  R3,8
  213.        SLA  R3,1
  214.        LDCR @B04,4
  215.        MOV  @SAUTBL(R3),R3
  216.        MPY  R3,R7
  217.        LI   R2,SECBUF
  218.  
  219.        SRL  R8,1
  220.        JNC  MKD21
  221.        AI   R2,>100
  222. MKD21  SRL  R7,1
  223.        JNC  MKD22
  224.        AI   R8,>8000
  225. MKD22
  226.        LDCR @ZERO,4
  227.  
  228. * If we are using >1 sector/au and we are in the 1st half of
  229. * the 512 byte block, there is no need to read the old data
  230.  
  231.        CI   R3,1
  232.        JEQ  MKD23
  233.        CI   R2,SECBUF
  234.        JEQ  MKD24
  235. *      CI   R7,0
  236. *      JNE  MKD24
  237. *      CI   R8,0
  238. *      JNE  MKD24
  239. MKD23
  240.        BLWP @BANKIT
  241.        DATA SCSIRD
  242.        JNE  MKD29
  243. MKD24
  244.        LI   R0,256
  245.        LI   R4,DFDR
  246. MKD25  LDCR @B02,4
  247.        MOV  *R4+,R9
  248.        LDCR @ZERO,4
  249.        MOV  R9,*R2+
  250.        DECT R0
  251.        JNE  MKD25
  252.  
  253.        BLWP @BANKIT
  254.        DATA SCSIWT
  255.        JNE  MKD29
  256.  
  257. * If we're writing out the VIB, write out the copy as well
  258.  
  259.        CI   R7,0
  260.        JNE  MKD25A
  261.        CI   R8,0
  262.        JNE  MKD25A
  263.        AI   R8,16
  264.        BLWP @BANKIT
  265.        DATA SCSIWT
  266. MKD25A
  267. * Now we'll write out the FDIR.  All entries are blank except
  268. * for the last one which points back to the DDR
  269.  
  270.        MOV  R5,R7
  271.        MPY  R3,R7
  272.        LI   R2,SECBUF
  273.  
  274.        SRL  R8,1
  275.        JNC  MKD26
  276.        AI   R2,>100
  277. MKD26  SRL  R7,1
  278.        JNC  MKD27
  279.        AI   R8,>8000
  280. MKD27
  281.        LDCR @ZERO,4
  282.  
  283.        CI   R3,1
  284.        JEQ  MKD28
  285.        CI   R2,SECBUF
  286.        JEQ  MKD30
  287.  
  288. MKD28  BLWP @BANKIT
  289.        DATA SCSIRD
  290.        JEQ  MKD30
  291. MKD29  B    @MKDERR
  292.  
  293. MKD30  LI   R0,254
  294. MKD31  CLR  *R2+
  295.        DECT R0
  296.        JNE  MKD31
  297.  
  298.        LDCR @B02,4           Now get AU of DDR
  299.        MOV  @MKDAU1,R5
  300.        LDCR @ZERO,4
  301.        MOV  R5,*R2
  302.  
  303.        BLWP @BANKIT
  304.        DATA SCSIWT
  305.        JNE  MKD29
  306.  
  307. * Now write out the DDR to disk.  Increment the # of files
  308. * and add the AU to the table of subdirectories
  309. *
  310.        BL   @GETDDR
  311.        LDCR @B03,4           Select RAM bank 3
  312.        AB   @B01,@23(R5)     Increment # of subdirectories
  313.  
  314. * the AU of the new DDR goes
  315. *
  316.        LDCR @B02,4
  317.        MOV  @MKDIDX,R10
  318.        LDCR @B03,4
  319.        SLA  R10,1
  320.        A    R5,R10
  321.        AI   R10,28
  322.  
  323.        MOV  R5,R1
  324.        AI   R1,254
  325.  
  326. MKD32  C    R1,R10
  327.        JEQ  MKD33
  328.        MOV  @-2(R1),*R1
  329.        DECT R1
  330.        JMP  MKD32
  331. MKD33
  332.        LDCR @B02,4           Save the AU
  333.        MOV  @MKDAU1,R2
  334.        LDCR @B03,4
  335.        MOV  R2,*R1
  336.  
  337. * Now write the parent DDR back out to disk and
  338. * we're done!
  339. *
  340.        LDCR @B04,4
  341.        MOV  @SAVEAU,R7       Get AU of parent DDR
  342.  
  343.        MOV  R6,R3
  344.        SRL  R3,8
  345.        SLA  R3,1
  346.        MOV  @SAUTBL(R3),R3
  347.        MPY  R3,R7
  348.        LI   R2,SECBUF
  349.        SRL  R8,1
  350.        JNC  MKD34
  351.        AI   R2,>100
  352. MKD34  SRL  R7,1
  353.        JNC  MKD35
  354.        AI   R8,>8000
  355. MKD35
  356.        LDCR @ZERO,4
  357.  
  358. * We don't have to read the old data if we have more
  359. * than 1 sector/AU and we're writing at the beginning
  360. * of a 512 byte block.  However, if we're writing
  361. * out the VIP, we must read because the bitmap.
  362.  
  363.        CI   R3,1
  364.        JEQ  MKD36
  365.        CI   R2,SECBUF
  366.        JNE  MKD36
  367.        CI   R7,0
  368.        JNE  MKD37
  369.        CI   R8,0
  370.        JNE  MKD37
  371.  
  372. MKD36  BLWP @BANKIT
  373.        DATA SCSIRD
  374.        JNE  MKD39
  375.  
  376. MKD37  LI   R0,256
  377. MKD38  LDCR @B03,4
  378.        MOV  *R5+,R1
  379.        LDCR @ZERO,4
  380.        MOV  R1,*R2+
  381.        DECT R0
  382.        JNE  MKD38
  383.  
  384.        BLWP @BANKIT
  385.        DATA SCSIWT
  386.        JEQ  MKD40
  387. MKD39  B    @MKDERR
  388.  
  389. * Hooray!  We're done.  Write out a success code and return
  390.  
  391. MKD40  MOVB @ZERO,@>8350
  392.        B    @DSRRT
  393.  
  394. MKDRST DATA 0
  395.        BYTE 0
  396.        TEXT 'DIR'
  397.        DATA 0                Sectors/AU
  398.        DATA 0,0              Date/Time of creation
  399.        BYTE 0                # of files
  400.        BYTE 0                # of subdirectories
  401. MKDRND
  402.